﻿//一、类继承

//namespace cs_basic_08
//{
//    class SomeClass
//    {
//        public string Field1 = "基类字段";
//        public void Method1(string value)
//        {
//            Console.WriteLine($"基类方法1:{value}");
//        }
//    }
//    class OtherClass: SomeClass
//    {
//        public string Field2 = "派生字段";
//        public void Method2(string value)
//        {
//            Console.WriteLine($"派生方法2:{value}");
//        }
//    }
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            OtherClass oc = new OtherClass();

//            oc.Method1(oc.Field1);
//            oc.Method1(oc.Field2);
//            oc.Method2(oc.Field1);
//            oc.Method2(oc.Field2);
//        }
//    }
//}
//预测结果： 

//    基类方法1：基类字段
//    基类方法1：派生字段
//    派生方法2：基类字段
//    派生方法2：派生字段  预测正确


//二、 虚函数和重写
//using System;

//public class Animal
//{
//    public virtual void Eat()
//    {
//        Console.WriteLine("动物吃东西");
//    }

//    public void Sleep()
//    {
//        Console.WriteLine("动物睡觉");
//    }
//}

//public class Dog : Animal
//{
//    public override void Eat()
//    {
//        Console.WriteLine("狗吃骨头");
//    }

//    public new void Sleep()
//    {
//        Console.WriteLine("狗趴着睡");
//    }
//}

//public class Program
//{
//    public static void Main()
//    {
//        Animal animal1 = new Animal();
//        Animal animal2 = new Dog();
//        Dog dog = new Dog();

//        animal1.Eat();   // 输出？
//        animal1.Sleep(); // 输出？

//        animal2.Eat();   // 输出？
//        animal2.Sleep(); // 输出？

//        dog.Eat();       // 输出？
//        dog.Sleep();     // 输出？
//    }
//}

//预测：
//    动物吃东西
//    动物睡觉
//    狗吃骨头
//    狗趴着睡（X）
//    狗吃骨头
//    狗趴着睡

//三、深入理解普通方法+new隐藏，和虚方法+重写的区别
//namespace cs_learn_08
//{
//    class SomeClass
//    {
//        public string Field1 = "SomeClass Field1";
//        public void Method1(string value)
//        {
//            Console.WriteLine($"SomeClass.Method1: {value}");
//        }
//    }
//    class OtherClass:SomeClass
//    {
//        new public string Field1 = "OtherClass Field1";
//        new public void Method1(string value)
//        {
//            Console.WriteLine($"OtherClass.Method1: {value}");
//        }
//    }
//    class Program
//    {
//        static void Main()
//        {
//            OtherClass oc = new OtherClass();
//            SomeClass sc = new SomeClass();
//            SomeClass ww = new OtherClass();
//            oc.Method1(oc.Field1);
//            sc.Method1(sc.Field1);
//            ww.Method1(ww.Field1);
//        }
//    }
//}
namespace cs_learn_08
{
    class SomeClass
    {
        public string Field1 = "SomeClass Field1";
        virtual public void Method1(string value)
        {
            Console.WriteLine($"SomeClass.Method1: {value}");
        }
    }
    class OtherClass : SomeClass
    {
        new public string Field1 = "OtherClass Field1";
        override  public void Method1(string value)
        {
            Console.WriteLine($"OtherClass.Method1: {value}");
        }
    }
    class Program
    {
        static void Main()
        {
            OtherClass oc = new OtherClass();
            SomeClass sc = (SomeClass)oc;
            //SomeClass sc = new SomeClass();
            SomeClass ww = new OtherClass();
            oc.Method1(oc.Field1);
            sc.Method1(sc.Field1);
            ww.Method1(ww.Field1);
        }
    }
}
//预测：
//    Other...Other
//    Other...Some 
//    Other...Some